package utils

import (
	"errors"
	"fmt"
	"k8s-admin/global"
	"k8s-admin/models"
	"os"
	"os/exec"
	"time"
)

var dir, _ = os.Getwd()

func TimeTask(times int64, shell_exec, timer_number string, period int, ID uint) {
	/*
		错误重试机制
		判断任务类型
		先把脚本任务写u入文件，然后执行sh脚本
	*/
	file_name := time.Now().Format("2006-01-02-15-04-05") // 根据时间创建任务脚本文件

	file, err := os.OpenFile(dir+"/"+"tmeplate/shell/"+file_name+".sh", os.O_CREATE|os.O_WRONLY, 0777)
	if err != nil {

		global.TPLogger.Error(err)
	} else {
		_, err = file.WriteString("\n" + shell_exec + "\n")
		if err != nil {
			global.TPLogger.Error(err)
		}
		defer file.Close()
	}

	// 判断周期类型
	switch period {
	case 1:
		// 多少秒执行一次
		ticker := time.NewTicker(time.Duration(times) * time.Second)
		for {
			<-ticker.C
			err := second(file.Name(), timer_number, ID)
			if err != nil {
				logs(ID, "定时任务执行失败!!!") // 将错误信息记录到数据库中
				global.TPLogger.Error(err)
				return
			} else {

			}
		}
	case 2:
		fmt.Println("一次性执行")
	case 3:
		fmt.Println("周期执行")
	default:

	}

}

func second(shell_exec, timer_number string, ID uint) error {
	fmt.Println("开始执行....................")
	fmt.Println("/bin/bash", shell_exec)
	//log.Printf("执行命令：%s","/bin/bash "+shell_exec)
	cmd := exec.Command("/bin/bash", shell_exec)
	out, err := cmd.Output()
	if err != nil {
		timerStatusUpdate(timer_number)
		return err
	} else {
		logs(ID, string(out)) // 将执行过程标准输出记录到数据库中
		return nil
	}

}

func timerStatusUpdate(timerNumber string) error {
	// 失败将状态更新为1
	tx := global.GORM.Model(&models.Timing{}).Where("timer_number=?", timerNumber).Update("status", 1)
	if tx.Error != nil {
		return tx.Error
	} else if tx.RowsAffected == 0 {
		return errors.New("更新失败，没有该数据")
	} else {
		return nil
	}
}
func logs(id uint, log_txt string) {
	_ = global.GORM.Create(&models.TimerLogs{
		TimingID: id,
		Logs:     log_txt,
	})
}
